/*
 * StartApplication.java
 *
 * Created on Nov 20, 2009 2:33:22 PM;
 */

package org.sunspotworld;

import com.sun.spot.peripheral.Spot;
import com.sun.spot.peripheral.radio.IConnectionID;
import com.sun.spot.peripheral.radio.RadioPolicy;
import com.sun.spot.sensorboard.EDemoBoard;
import com.sun.spot.sensorboard.peripheral.ISwitch;
import com.sun.spot.sensorboard.peripheral.ITriColorLED;
import com.sun.spot.peripheral.radio.RadioFactory;
import com.sun.spot.peripheral.radio.IRadioPolicyManager;
import com.sun.spot.io.j2me.radiostream.*;
import com.sun.spot.io.j2me.radiogram.*;
import com.sun.spot.sensorboard.peripheral.IAccelerometer3D;
import com.sun.spot.util.*;

import java.io.*;
import java.util.Random;
import javax.microedition.io.*;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

/**
 * The startApp method of this class is called by the VM to start the
 * application.
 * 
 * The manifest specifies this class as MIDlet-1, which means it will
 * be selected for execution.
 */
public class StartApplication extends MIDlet {

    private ITriColorLED [] leds = EDemoBoard.getInstance().getLEDs();

    protected void startApp() throws MIDletStateChangeException {
        System.out.println("Posture Correction");
        new BootloaderListener().start();   // monitor the USB (if connected) and recognize commands from host

        long ourAddr = RadioFactory.getRadioPolicyManager().getIEEEAddress();
        System.out.println("Our radio address = " + IEEEAddress.toDottedHex(ourAddr));

//        ISwitch sw1 = EDemoBoard.getInstance().getSwitches()[EDemoBoard.SW1];
//        leds[0].setRGB(100,0,0);                // set color to moderate red
//        while (sw1.isOpen()) {                  // done when switch is pressed
//            leds[0].setOn();                    // Blink LED
//            Utils.sleep(250);                   // wait 1/4 seconds
//            leds[0].setOff();
//            Utils.sleep(1000);                  // wait 1 second
//        }
        IAccelerometer3D ia3d = EDemoBoard.getInstance().getAccelerometer();

        Random ra = new Random(System.currentTimeMillis());
        int r = ra.nextInt()%250;
        int g = ra.nextInt()%250;
        int b = ra.nextInt()%250;

        while(true){
            try {
                for(int i=0; i<8; i++) {
                    r = (r + i*5 + (ra.nextInt()%3))%250;
                    g = (g + i*5 + (ra.nextInt()%3))%250;
                    b = (b + i*5 + (ra.nextInt()%3))%250;
                    leds[i].setOff();
                    leds[i].setRGB(r, g, b);
                    leds[i].setOn();
                }

                
                //System.out.println(ia3d.getAccelX());
                if(ia3d.getAccelY()>=1.5)
                    break;
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            Utils.sleep(100);
        }

        notifyDestroyed();                      // cause the MIDlet to exit
    }

    protected void pauseApp() {
        // This is not currently called by the Squawk VM
    }

    /**
     * Called if the MIDlet is terminated by the system.
     * I.e. if startApp throws any exception other than MIDletStateChangeException,
     * if the isolate running the MIDlet is killed with Isolate.exit(), or
     * if VM.stopVM() is called.
     * 
     * It is not called if MIDlet.notifyDestroyed() was called.
     *
     * @param unconditional If true when this method is called, the MIDlet must
     *    cleanup and release all resources. If false the MIDlet may throw
     *    MIDletStateChangeException  to indicate it does not want to be destroyed
     *    at this time.
     */
    protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {
        for (int i = 0; i < 8; i++) {
            leds[i].setOff();
        }
    }
}
